// 权限管理工具
// 需求 4.2: 用户授予权限时，启用位置追踪功能
// 需求 4.4: 用户拒绝权限时，禁用需要位置的功能

const locationUtil = require('./location')

/**
 * 需要位置权限的功能列表
 */
const LOCATION_REQUIRED_FEATURES = {
  ROUTE_PLANNING: '路径规划',
  POI_SEARCH: '景点搜索',
  NAVIGATION: '实时导航',
  POI_DETECTION: '景点检测',
  FOOTPRINT_RECORDING: '足迹记录'
}

/**
 * 检查功能是否可用
 * 需求 4.4: 根据权限状态判断功能是否可用
 * @param {string} featureName - 功能名称
 * @returns {Promise<{available: boolean, reason: string}>}
 */
async function checkFeatureAvailability(featureName) {
  // 检查是否需要位置权限
  const requiresLocation = Object.values(LOCATION_REQUIRED_FEATURES).includes(featureName)
  
  if (!requiresLocation) {
    return { available: true, reason: 'no_permission_required' }
  }

  try {
    const permissionResult = await locationUtil.checkLocationPermission()
    
    if (permissionResult.hasPermission) {
      // 需求 4.2: 权限已授予，功能可用
      return { available: true, reason: 'permission_granted' }
    } else {
      // 需求 4.4: 权限未授予，功能不可用
      return { 
        available: false, 
        reason: permissionResult.status === 'denied' ? 'permission_denied' : 'permission_not_requested'
      }
    }
  } catch (err) {
    console.error('检查功能可用性失败:', err)
    return { available: false, reason: 'check_failed' }
  }
}

/**
 * 请求功能所需权限
 * 需求 4.1: 请求位置访问权限并说明使用目的
 * @param {string} featureName - 功能名称
 * @param {boolean} showExplanation - 是否显示详细说明
 * @returns {Promise<boolean>}
 */
async function requestFeaturePermission(featureName, showExplanation = true) {
  const requiresLocation = Object.values(LOCATION_REQUIRED_FEATURES).includes(featureName)
  
  if (!requiresLocation) {
    return true
  }

  try {
    const result = await locationUtil.requestLocationPermission(showExplanation)
    return result.granted
  } catch (err) {
    console.error('请求权限失败:', err)
    return false
  }
}

/**
 * 显示功能不可用提示
 * 需求 4.4: 用户拒绝权限时，显示功能限制说明
 * @param {string} featureName - 功能名称
 * @param {Function} onConfirm - 确认回调（跳转到权限页面）
 */
function showFeatureUnavailableHint(featureName, onConfirm) {
  wx.showModal({
    title: '功能不可用',
    content: `使用"${featureName}"功能需要位置权限。请先授予位置权限。`,
    confirmText: '去授权',
    cancelText: '取消',
    success: (res) => {
      if (res.confirm && onConfirm) {
        onConfirm()
      }
    }
  })
}

/**
 * 导航到权限说明页面
 * @param {string} returnUrl - 返回地址
 */
function navigateToPermissionGuide(returnUrl) {
  wx.navigateTo({
    url: '/pages/permission-guide/permission-guide?returnUrl=' + 
         encodeURIComponent(returnUrl)
  })
}

/**
 * 获取被禁用的功能列表
 * 需求 4.4: 列出因权限问题而被禁用的功能
 * @returns {Promise<Array<string>>}
 */
async function getDisabledFeatures() {
  try {
    const permissionResult = await locationUtil.checkLocationPermission()
    
    if (permissionResult.hasPermission) {
      // 需求 4.2: 权限已授予，所有功能可用
      return []
    } else {
      // 需求 4.4: 权限未授予，返回需要位置权限的功能列表
      return Object.values(LOCATION_REQUIRED_FEATURES)
    }
  } catch (err) {
    console.error('获取禁用功能列表失败:', err)
    return Object.values(LOCATION_REQUIRED_FEATURES)
  }
}

/**
 * 执行需要权限的操作
 * 如果没有权限，会自动请求或提示
 * @param {string} featureName - 功能名称
 * @param {Function} action - 要执行的操作
 * @param {Object} options - 配置选项
 * @returns {Promise<boolean>} 是否成功执行
 */
async function executeWithPermission(featureName, action, options = {}) {
  const { 
    showExplanation = true,
    autoRequest = true,
    returnUrl = null 
  } = options

  // 检查功能是否可用
  const availability = await checkFeatureAvailability(featureName)
  
  if (availability.available) {
    // 需求 4.2: 权限已授予，执行操作
    try {
      await action()
      return true
    } catch (err) {
      console.error('执行操作失败:', err)
      return false
    }
  } else {
    // 需求 4.4: 权限未授予
    if (autoRequest) {
      // 自动请求权限
      const granted = await requestFeaturePermission(featureName, showExplanation)
      
      if (granted) {
        // 权限已授予，执行操作
        try {
          await action()
          return true
        } catch (err) {
          console.error('执行操作失败:', err)
          return false
        }
      } else {
        // 权限被拒绝，显示提示
        showFeatureUnavailableHint(featureName, () => {
          if (returnUrl) {
            navigateToPermissionGuide(returnUrl)
          }
        })
        return false
      }
    } else {
      // 不自动请求，只显示提示
      showFeatureUnavailableHint(featureName, () => {
        if (returnUrl) {
          navigateToPermissionGuide(returnUrl)
        }
      })
      return false
    }
  }
}

module.exports = {
  LOCATION_REQUIRED_FEATURES,
  checkFeatureAvailability,
  requestFeaturePermission,
  showFeatureUnavailableHint,
  navigateToPermissionGuide,
  getDisabledFeatures,
  executeWithPermission
}
